﻿// ***********************************************************************
// Assembly         : Delta_entidad
// Author           : Juan Alberto Cerino Gomez
// Created          : 03-28-2013
//
// Last Modified By : Juan Alberto Cerino Gomez
// Last Modified On : 05-08-2013
// ***********************************************************************
// <copyright file="TablasGral.cs" company="Delta Bussines">
//     Copyright (c) 2013  Delta Bussines. All rights reserved.
// </copyright>
// <summary></summary>
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Delta_util.Estaticos;
using System.Xml;
using Delta_entidad.Atributos;

namespace Delta_entidad.EntidadesControl
{
    /// <summary>
    /// Entidad que representa los datos de una tabla general, es decir, una tabla completamente dinámica, las tablas generales son aquellas que no cuentan con una tabla fisica en la base de datos,
    /// aun asi, Delta Grid, genera una vista simulando la tabla general.
    /// </summary>
    [Serializable]
    [AttEntidad("DG_tablas_gral", "id_tabla_gral,id_tipo_gral", true, 2, true, true, Enumerados.TIPO_OPERACION_GRID.INSERTAR, Enumerados.TIPO_OPERACION_GRID.ACTUALIZAR, Enumerados.TIPO_OPERACION_GRID.ELIMINAR, Enumerados.TIPO_OPERACION_GRID.IMPORTAR)]
    public class TablasGral : Base.TipoBase, Base.ITipo
    {

        /// <summary>
        /// Constructor de la clase.
        /// </summary>
        public TablasGral()
        {
            base.EsEntidadControl = true;
        }

        /// <summary>
        /// Variable que guarda la clave del tipo general.
        /// </summary>
        private int _id_tipo_gral;
        /// <summary>
        /// Variable que guarda la calve de la tabla general.
        /// </summary>
        private int _id_tabla_gral;
        /// <summary>
        /// Variable que guarda el contenido XML de los datos de la tabla.
        /// </summary>
        private string _dato;
        /// <summary>
        /// Variable que guarda la referencia de la tabla.
        /// </summary>
        private string _referencia1;
        /// <summary>
        /// Variable que guarda el folio de la tabla.
        /// </summary>
        private int _folio;
        /// <summary>
        /// Variable que guarda la fecha de creación de la tabla.
        /// </summary>
        private DateTime _fecha;
        /// <summary>
        /// Variable que guarda la fecha en la que se hizó la ultima modificación.
        /// </summary>
        private DateTime _fechaModificacion;


        /// <summary>
        /// Obtiene o establece la clave del tipo general.
        /// </summary>
        /// <value>Clave del tipo general.</value>
        [AttrParametro(System.Data.SqlDbType.SmallInt, 4, null, System.Data.ParameterDirection.Input, Enumerados.TIPO_QUERY.INSERTAR, Enumerados.TIPO_QUERY.OBTENER)]
        [AttPropiedad("id_tipo_gral", false, false, false, true, Enumerados.TIPO_EDITOR.TEXBOX, null, 1)]
        public int id_tipo_gral
        {
            get { return _id_tipo_gral; }
            set { _id_tipo_gral = value; }
        }
        /// <summary>
        /// Obtiene o establece la clave de la tabla general.
        /// </summary>
        /// <value>Clave de la tabla general.</value>
        [AttrParametro(System.Data.SqlDbType.Int, 4, null, System.Data.ParameterDirection.InputOutput, Enumerados.TIPO_QUERY.INSERTAR, Enumerados.TIPO_QUERY.OBTENER)]
        [AttPropiedad("id_tabla_gral", false, false, false, true, Enumerados.TIPO_EDITOR.TEXBOX, null, 2)]
        public int id_tabla_gral
        {
            get { return _id_tabla_gral; }
            set { _id_tabla_gral = value; }
        }
        /// <summary>
        /// Obtiene o establece la cadena XML que representa los datos de la tabla dinámica.
        /// </summary>
        /// <value>Dato en formato XML.</value>
        [AttrParametro(System.Data.SqlDbType.Xml, -1, null, System.Data.ParameterDirection.Input, Enumerados.TIPO_QUERY.INSERTAR)]
        [AttPropiedad("dato", false, false, false, true, Enumerados.TIPO_EDITOR.TEXBOX, null, 3)]
        public string dato
        {
            get { return _dato; }
            set { _dato = value; }
        }
        /// <summary>
        /// Obtiene o establece la referencia de la tabla.
        /// </summary>
        /// <value>Referencia de la tabla.</value>
        [AttrParametro(System.Data.SqlDbType.VarChar, 50, null, System.Data.ParameterDirection.Input, Enumerados.TIPO_QUERY.INSERTAR, Enumerados.TIPO_QUERY.OBTENER)]
        [AttPropiedad("referencia1", false, false, false, true, Enumerados.TIPO_EDITOR.TEXBOX, null, 4)]
        public string referencia1
        {
            get { return _referencia1; }
            set { _referencia1 = value; }
        }
        /// <summary>
        /// Obtiene o establece el folio de la tabla.
        /// </summary>
        /// <value>Folio de la tabla.</value>
        [AttrParametro(System.Data.SqlDbType.Int, 4, null, System.Data.ParameterDirection.Input, Enumerados.TIPO_QUERY.INSERTAR, Enumerados.TIPO_QUERY.OBTENER)]
        [AttPropiedad("folio", false, false, false, true, Enumerados.TIPO_EDITOR.TEXBOX, null, 5)]
        public int folio
        {
            get { return _folio; }
            set { _folio = value; }
        }
        /// <summary>
        /// Obtiene o establece la fecha en la que se creó la tabla.
        /// </summary>
        /// <value>Fecha de creación de la tabla.</value>
        public DateTime fecha
        {
            get { return _fecha; }
            set { _fecha = value; }
        }
        /// <summary>
        /// Obtiene o establece la fecha en la que se realizó la ultimo modificación en la tabla.
        /// </summary>
        /// <value>Fecha de la ultima modificación.</value>
        public DateTime fechaModificacion
        {
            get { return _fechaModificacion; }
            set { _fechaModificacion = value; }
        }

        /// <summary>
        /// Metodo que se encarga de obtener una fila de la tabla.
        /// </summary>
        /// <param name="fila">Número de fila que se quiere obtener.</param>
        /// <param name="configUsers">Configuración dinámica del tipo general.</param>
        /// <returns>ItemGral.</returns>
        public ItemGral ObtenerItem(int fila, Cat_tipo_gral configUsers)
        {
            ItemGral ndato = new ItemGral();
            string xmlData = dato;
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlData);
            XmlNode nodoPrincipal = doc.FirstChild;

            if (fila >= 1 && fila <= nodoPrincipal.ChildNodes.Count)
            {
                XmlNode nodoeliminar = nodoPrincipal.ChildNodes[fila - 1];

                ndato.campos_user = nodoeliminar.OuterXml;
                ndato.FijarConfiguracionDinamica(configUsers);
                ndato.id_tabla_gral = id_tabla_gral;
                ndato.id_tipo_gral = id_tipo_gral;

            }
            return ndato;
        }
        /// <summary>
        /// Metodo que se encarga de eliminar una fila de la tabla general.
        /// </summary>
        /// <param name="fila">Número de fila a eliminar.</param>
        public void EliminarFila(int fila)
        {

            string xmlData = dato;
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlData);
            XmlNode nodoPrincipal = doc.FirstChild;

            if (fila >= 1 && fila <= nodoPrincipal.ChildNodes.Count)
            {
                XmlNode nodoeliminar = nodoPrincipal.ChildNodes[fila - 1];
                doc.FirstChild.RemoveChild(nodoeliminar);
                this.dato = doc.OuterXml;
            }

        }
        /// <summary>
        /// Metodo que se encarga de insertar/reemplazar una fila en la tabla general.
        /// </summary>
        /// <param name="datos">Entidad que contiene los nuevos datos.</param>
        /// <param name="fila">Número de fila a reemplazar, colocar 0 para insertar el dato a la tabla.</param>
        public void InsertarFila(ItemGral datos, int fila = 0)
        {
            string xmlData = dato;
            if (string.IsNullOrEmpty(dato) || dato == "<tabla />")
                xmlData = "<tabla></tabla>";


            if (fila == 0)
                dato = xmlData.Insert(xmlData.IndexOf("</tabla"), datos.campos_user);
            else
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xmlData);
                XmlNode nodoPrincipal = doc.FirstChild;

                if (fila >= 1 && fila <= nodoPrincipal.ChildNodes.Count)
                {
                    XmlNode nodoreemplazar = nodoPrincipal.ChildNodes[fila - 1];
                    XmlDocument ndatos = new XmlDocument();
                    ndatos.LoadXml(datos.campos_user);
                    foreach (XmlAttribute att in ndatos.FirstChild.Attributes)
                        if (nodoreemplazar.Attributes[att.Name] == null)
                        {
                            XmlAttribute natributo = doc.CreateAttribute(att.Name);
                            natributo.Value = att.Value;
                            nodoreemplazar.Attributes.Append(natributo);
                        }
                        else
                            nodoreemplazar.Attributes[att.Name].Value = att.Value;
                    dato = doc.OuterXml;
                }
            }


        }
    }
}
